package com.mrx.spring.security.utils;

import com.mrx.spring.security.model.SecurityUser;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;

import java.util.Objects;

/**
 * 全局 ThreadLocal 用户对象
 *
 * @author Mr.X
 * @since 2023-10-16 15:04
 **/
public class SecurityUtils {

    private static final ThreadLocal<SecurityUser> CURRENT_USER = new ThreadLocal<>();

    /**
     * 设置当前登录的用户信息
     *
     * @param currentUser 当前登录的用户信息
     */
    public static void setCurrentUser(@NonNull SecurityUser currentUser) {
        CURRENT_USER.set(currentUser);
    }

    /**
     * 获取当前登录的用户信息
     *
     * @return 当前登录的用户信息
     */
    @Nullable
    public static SecurityUser getCurrentUser() {
        return CURRENT_USER.get();
    }

    /**
     * 获取当前登录的用户的 id, 如果未能成功获取, 将会抛出异常
     *
     * @return 当前登录的用户的 id
     */
    public static Long getCurrentUserId() {
        return Objects.requireNonNull(getCurrentUser()).getUserId();
    }

    /**
     * 移除当前用户信息
     */
    public static void clearCurrentUser() {
        CURRENT_USER.remove();
    }

}
